Skip to content

Test skipping based on module (esp. healpix) availability#944

Merged
sadielbartholomew merged 13 commits into
NCAS-CMS:mainfrom
sadielbartholomew:test-skipping-post3.20
Jun 10, 2026
Merged

Test skipping based on module (esp. healpix) availability#944
sadielbartholomew merged 13 commits into
NCAS-CMS:mainfrom
sadielbartholomew:test-skipping-post3.20

Conversation

@sadielbartholomew

Copy link
Copy Markdown
Member

We have some test skipping for lack of required module availability, including cases where it is an 'optional' dependency not enforced by packaging requirements, but not comprehensive and not accounting for the new healpix optional dependency.

In the background to the EXPECT GA I've went in and added all skips required, replacing those on individual methods with module-level skipping for relevant test modules (regrid-related tests which all need esmpy including one case where there was a false positive i.e. test pass from lack of skip, and tests requiring an explicit or under-the-hood use of healpix).

@davidhassell a sanity check would be useful but feel free to approve if you don't think a review is necessary given this PR is only trivial test infra changes.

@sadielbartholomew sadielbartholomew self-assigned this Apr 15, 2026
@sadielbartholomew sadielbartholomew added the testing Issues related to units tests and their coverage label Apr 15, 2026
@sadielbartholomew

Copy link
Copy Markdown
Member Author

@davidhassell just a reminder as per our meeting today that it would be great to get this reviewed and merged when you have a change to look. Thanks.

@davidhassell davidhassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Sadie,

I find that the setup variables are not available to the test methods ... is that what you get?

>>python test_HEALPix_utils.py 
Run date: 2026-05-30 12:00:00.673592
Platform: Linux-6.8.0-124-generic-x86_64-with-glibc2.39 

<snip>

test_HEALPix_pix2zuniq (__main__.DataTest.test_HEALPix_pix2zuniq)
Test _pix2zuniq ... ERROR
test_HEALPix_uniq2zuniq (__main__.DataTest.test_HEALPix_uniq2zuniq)
Test _uniq2zuniq ... ERROR
test_HEALPix_zuniq2pix (__main__.DataTest.test_HEALPix_zuniq2pix)
Test _zuniq2pix ... ERROR
test_HEALPix_zuniq2uniq (__main__.DataTest.test_HEALPix_zuniq2uniq)
Test _zuniq2uniq ... ERROR

======================================================================
ERROR: test_HEALPix_pix2zuniq (__main__.DataTest.test_HEALPix_pix2zuniq)
Test _pix2zuniq
----------------------------------------------------------------------
Traceback (most recent call last):
  File "cf-python/cf/test/test_HEALPix_utils.py", line 84, in test_HEALPix_pix2zuniq
    for r, i in zip(refinement_levels, nested_indices)
                    ^^^^^^^^^^^^^^^^^
NameError: name 'refinement_levels' is not defined

======================================================================
ERROR: test_HEALPix_uniq2zuniq (__main__.DataTest.test_HEALPix_uniq2zuniq)
Test _uniq2zuniq
----------------------------------------------------------------------
Traceback (most recent call last):
  File "cf-python/cf/test/test_HEALPix_utils.py", line 52, in test_HEALPix_uniq2zuniq
    np.array_equal(_uniq2zuniq(nuniq_indices), zuniq_indices)
                               ^^^^^^^^^^^^^
NameError: name 'nuniq_indices' is not defined

======================================================================
ERROR: test_HEALPix_zuniq2pix (__main__.DataTest.test_HEALPix_zuniq2pix)
Test _zuniq2pix
----------------------------------------------------------------------
Traceback (most recent call last):
  File "cf-python/cf/test/test_HEALPix_utils.py", line 68, in test_HEALPix_zuniq2pix
    order, i = _zuniq2pix(zuniq_indices, nest=True)
                          ^^^^^^^^^^^^^
NameError: name 'zuniq_indices' is not defined

======================================================================
ERROR: test_HEALPix_zuniq2uniq (__main__.DataTest.test_HEALPix_zuniq2uniq)
Test _zuniq2uniq
----------------------------------------------------------------------
Traceback (most recent call last):
  File "cf-python/cf/test/test_HEALPix_utils.py", line 60, in test_HEALPix_zuniq2uniq
    np.array_equal(_zuniq2uniq(zuniq_indices), nuniq_indices)
                               ^^^^^^^^^^^^^
NameError: name 'zuniq_indices' is not defined

----------------------------------------------------------------------
Ran 4 tests in 0.009s

FAILED (errors=4)
>>

@sadielbartholomew

Copy link
Copy Markdown
Member Author

Good spot @davidhassell, thanks - I thought I'd sorted that in a clever way but forgot to check how it was handled when healpix is installed which is by far the most important use case! Will get this updated to fix it...

@davidhassell

Copy link
Copy Markdown
Collaborator

Hi Sadie - nearly there :) test_regrid.py still has a bug:

test_Field_regrid_2d_field (__main__.RegridTest.test_Field_regrid_2d_field)
2-d regridding with Field destination grid. ... ERROR
test_Field_regrid_chunks (__main__.RegridTest.test_Field_regrid_chunks)
Regridding of chunked axes ... ok
test_Field_regrid_weights_file (__main__.RegridTest.test_Field_regrid_weights_file)
Regridding creation/use of weights file ... ERROR
test_Field_regridc_1d_coordinates_z (__main__.RegridTest.test_Field_regridc_1d_coordinates_z)
1-d Z Cartesian regridding with coordinates destination grid. ... ERROR
test_Field_regridc_1d_field (__main__.RegridTest.test_Field_regridc_1d_field)
1-d Cartesian regridding with Field destination grid. ... ERROR
test_Field_regridc_2d_coords (__main__.RegridTest.test_Field_regridc_2d_coords)
2-d Cartesian regridding with coords destination grid. ... ERROR
test_Field_regridc_3d_field (__main__.RegridTest.test_Field_regridc_3d_field)
3-d Cartesian regridding with Field destination grid. ... ERROR
test_Field_regridc_domain (__main__.RegridTest.test_Field_regridc_domain)
Spherical regridding with Domain destination grid. ... ERROR
test_Field_regrids_bad_dst (__main__.RegridTest.test_Field_regrids_bad_dst)
Disallowed destination grid types raise an exception. ... ERROR
test_Field_regrids_coords (__main__.RegridTest.test_Field_regrids_coords)
Spherical regridding with coords destination grid. ... ERROR
test_Field_regrids_domain (__main__.RegridTest.test_Field_regrids_domain)
Spherical regridding with Domain destination grid. ... ERROR
test_Field_regrids_field_operator (__main__.RegridTest.test_Field_regrids_field_operator)
Spherical regridding with operator destination grid. ... ERROR
test_Field_regrids_non_coordinates (__main__.RegridTest.test_Field_regrids_non_coordinates)
Check setting of non-coordinate metadata. ... ERROR
test_return_esmpy_regrid_operator (__main__.RegridTest.test_return_esmpy_regrid_operator)
esmpy regrid operator returns esmpy.Regrid in regrids and regridc ... ERROR

======================================================================
ERROR: test_Field_regrid_2d_field (__main__.RegridTest.test_Field_regrid_2d_field)
2-d regridding with Field destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 166, in test_Field_regrid_2d_field
    dst = self.dst.copy()
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regrid_weights_file (__main__.RegridTest.test_Field_regrid_weights_file)
Regridding creation/use of weights file
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 783, in test_Field_regrid_weights_file
    dst = self.dst
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regridc_1d_coordinates_z (__main__.RegridTest.test_Field_regridc_1d_coordinates_z)
1-d Z Cartesian regridding with coordinates destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 755, in test_Field_regridc_1d_coordinates_z
    src = cf.read(self.filename_xyz)[0]
                  ^^^^^^^^^^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'filename_xyz'

======================================================================
ERROR: test_Field_regridc_1d_field (__main__.RegridTest.test_Field_regridc_1d_field)
1-d Cartesian regridding with Field destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 669, in test_Field_regridc_1d_field
    dst = self.dst.copy()
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regridc_2d_coords (__main__.RegridTest.test_Field_regridc_2d_coords)
2-d Cartesian regridding with coords destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 386, in test_Field_regridc_2d_coords
    dst = self.dst.copy()
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regridc_3d_field (__main__.RegridTest.test_Field_regridc_3d_field)
3-d Cartesian regridding with Field destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 565, in test_Field_regridc_3d_field
    dst = self.dst.copy()
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regridc_domain (__main__.RegridTest.test_Field_regridc_domain)
Spherical regridding with Domain destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 452, in test_Field_regridc_domain
    dst = self.dst
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regrids_bad_dst (__main__.RegridTest.test_Field_regrids_bad_dst)
Disallowed destination grid types raise an exception.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 417, in test_Field_regrids_bad_dst
    self.src.regrids(999, method="conservative")
    ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'src'

======================================================================
ERROR: test_Field_regrids_coords (__main__.RegridTest.test_Field_regrids_coords)
Spherical regridding with coords destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 317, in test_Field_regrids_coords
    dst = self.dst.copy()
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regrids_domain (__main__.RegridTest.test_Field_regrids_domain)
Spherical regridding with Domain destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 429, in test_Field_regrids_domain
    dst = self.dst
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regrids_field_operator (__main__.RegridTest.test_Field_regrids_field_operator)
Spherical regridding with operator destination grid.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 477, in test_Field_regrids_field_operator
    dst = self.dst
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

======================================================================
ERROR: test_Field_regrids_non_coordinates (__main__.RegridTest.test_Field_regrids_non_coordinates)
Check setting of non-coordinate metadata.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 515, in test_Field_regrids_non_coordinates
    src = self.src
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'src'

======================================================================
ERROR: test_return_esmpy_regrid_operator (__main__.RegridTest.test_return_esmpy_regrid_operator)
esmpy regrid operator returns esmpy.Regrid in regrids and regridc
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/david/cf-python/cf/test/test_regrid.py", line 818, in test_return_esmpy_regrid_operator
    dst = self.dst
          ^^^^^^^^
AttributeError: 'RegridTest' object has no attribute 'dst'

----------------------------------------------------------------------
Ran 14 tests in 3.044s

FAILED (errors=13)

@sadielbartholomew

Copy link
Copy Markdown
Member Author

Ah yes, sorry somehow my main environment on Python 3.14 which is meant to have everything optional in didn't have esmpy installed so those tests got skipped and I missed it, oops! Pushing a commit to fix it now.

@sadielbartholomew

Copy link
Copy Markdown
Member Author

Thanks @davidhassell, should now (finally, sorry!) be good.

@davidhassell davidhassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks - all tests pass for me :) Merge away ...

@sadielbartholomew sadielbartholomew merged commit 6b4623b into NCAS-CMS:main Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

testing Issues related to units tests and their coverage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants